// 命名空间的应用
// Created by Administrator on 2025/6/16.
//
#include <iostream>
using namespace std;


/**
 * 命名空间可以使相同的函数名称，在不同的命名空间中，可以进行区分
 * 使用 命名空间名称::函数名 进行调用
 */

namespace oneScope {
    void func() {
        cout << "this is func of oneScope" << endl;
    }
}

namespace twoScope {
    void func() {
        cout << "this is func of twoScope" << endl;
    }

    void printHello() {
        cout << "hello twoScope" << endl;
    }
}

void scopeFunc1() {
    oneScope::func();
    twoScope::func();
}

/**
 * 使用 using namespace 引入命名空间，这样可以直接使用命名空间中的函数，而不用在前缀加命名空间名称
 *
 */
using namespace oneScope;

void scopeFunc2() {
    // call func of oneScope
    func();
}

/**
 * using 也可以用来引入命名空间中的指定函数，但是获取该命名空间的其它函数时还是需要通过前缀调用
 *
 * 引入 towScope 中的 printHello 函数
 */
using twoScope::printHello;

void scopeFunc3() {
    // printHello in towScope
    printHello();
    // 因为只引入了twoScope中的printHello函数，所以这里访问func还是需要通过前缀获取
    twoScope::func();
}

/**
 * 嵌套命名空间
 *
 */
namespace firstSpace {
    void printTxt() {
        cout << "firstSpace func" << endl;
    }

    namespace secondSpace {
        void printTxt() {
            cout << "secondSpace func" << endl;
        }
    }
}

using namespace firstSpace::secondSpace;

void nestFunc() {
    // call printTxt of secondSpace
    printTxt();
}

// int main(int argc, char *argv[]) {
//     // scopeFunc1();
//     // scopeFunc2();
//     nestFunc();
// }


/**
 *  扩展
 *
 *  命名空间中的函数和局部函数及全局函数的作用域
 */

namespace scopeB {
    int a = 222;

    namespace scopeC {
        int a = 333;
    }
}

int a = 111;

void nameScope1() {
    cout << "scopeB::a:\t" << scopeB::a << endl;
    cout << "scopeB::scopeC::a:\t" << scopeB::scopeC::a << endl;
    cout << "global a:\t" << a << endl;
    cout << "::a:\t" << ::a << endl; // ::a 表示获取全局变量a，当全局变量和局部变量同名时区分
    cout << endl;
    int a = 444;
    cout << "a:\t" << a << endl; // 获取局部变量a
    cout << "::a:\t" << ::a << endl;
}

void nameScope2() {
    using namespace scopeB;
    // cout <<"value of a is ：" << a << endl;  // 编译失败，全局变量a和ScopeB中的a同名，无法区分
    cout << "::a:\t" << ::a << endl;

    int a = 555;
    using namespace scopeB;
    cout <<"value of a is ：" << a << endl; // 局部变量a的优先级最高，这里获取的是局部变量a，所以这次不会因为变量同名导致编辑失败
    cout << "::a:\t" << ::a << endl;
}

int main(int argc, char *argv[]) {
    // nameScope1();
    nameScope2();
}
